package fr.iut2.tc1.client;

import java.util.ArrayList;

import fr.iut2.tc1.shared.FieldVerifier;
import fr.iut2.tc1.shared.UnTroll;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.History;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Troll implements EntryPoint, ValueChangeHandler<String> {

	
	// SERVICE
	private final MyServiceAsync myService = GWT.create(MyService.class);
	private DeckPanel pages;
	private int pageCourante;
	private ArrayList<ResultImage> listeImages;
	
	//SINGLETON
	private static Troll SINGLETON;
	
	/**
	 * Constructeur de la class principale
	 */
	public Troll()
	{
		//Définition du singleton
		SINGLETON = this;
		pageCourante=0;
		
		
	}

	
	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() 
	{	
		// Abonnement du recepteur à l'historique
		History.addValueChangeHandler(this);
		
		// lancement de l'historique
		//History.fireCurrentHistoryState();
		
		//On recupere la liste d'image
		myService.getImages(CallbackImages);

	}
	
	/***
	 * Permet de changer la page visible
	 * @param indice : Indice de la page à changer - 0 étant la première
	 */
	public void changerPage(int indice)
	{
		pages.showWidget(indice);
		History.newItem(Integer.toString(indice));
	}
	
	//Gestion de l'historique
	public void onValueChange(ValueChangeEvent<String> event) 
	{
		int historyToken = 0;
		
		try 
		{
			historyToken = Integer.parseInt(event.getValue());
			changerPage(historyToken);
		} catch (NumberFormatException e) {}
	}
	
	public void setHistorique(int r)
	{
		History.newItem(Integer.toString(r));
	}
	
	/**
	 * SINGLETON
	 * @return Le Singleton de la class
	 */
	public static Troll get() 
	{
		return SINGLETON;
	}
	
	/**
	 * Méthode fesant un appel au serveur pour supprimer un troll
	 * @param nomTroll - Le nom du troll
	 * ex : supprimmerTroll("NomDuTroll")
	 */
	public void supprimerTroll(String nomTroll)
	{
		// Effectuer l'appel au service
		myService.suppressionTroll(nomTroll, CallbackSuppression);
	}
	
	/**
	 * Récupère la liste d'images et la stocke dans une liste
	 * @return
	 */
	public ArrayList<ResultImage> getImages()
	{
		return this.listeImages;
	}
	
	/**
	 * Permet de recharger la page et les widget en réitérant tous les appels serveur nécéssaires
	 */
	public void rechargerPage()
	{
		//Sauvegarde de la page courante
		pageCourante = pages.getVisibleWidget();
		
		//On supprime la vue courante
		RootPanel.get().remove(pages);
		
		//On recharge les widgets avec les modifications
		myService.getSauvegarde("FILE", myMethodCallback);
	}
	
	/**
	 * Méthode permettant de faire un appel au serveur pour créer un troll
	 * nameTroll : nom du troll
	 * infoTroll : la ligne d'information stocké dans la sauvegarde du troll
	 * ex : ("norman", "Kastar/5/15/10/20/5/15/0")
	 */
	public void creerTroll(String nameTroll,String infoTroll)
	{
		//On recharge les widgets avec les modifications
		myService.creerTroll(nameTroll,infoTroll, CallbackCreation);
	}
	
	//Le troll qu'il faudra modifier
	public void setTrollToModif(UnTroll trollToModif)
	{
		((CreatModifTroll)pages.getWidget(3)).setTroll(trollToModif);
	}
	
	/***********************************************************************************************/
	/********************************* Les méthodes de CallBack des appels serveurs*****************/
	/***********************************************************************************************/
	
	// Créer un objet AsyncCallBack pour gérer le résultat.
	AsyncCallback<ArrayList<Result>> myMethodCallback = new AsyncCallback<ArrayList<Result>>() 
	{
		//Si succes : on recrée les différents widgets dans le deckPanel et on affiche la page courante
		public void onSuccess(ArrayList<Result> result) 
		{
			pages = new DeckPanel();
			
			ListeTroll composite1 = new ListeTroll(result);
			pages.add(composite1);
			
			ListeImageTroll composite2 = new ListeImageTroll(result);
			pages.add(composite2);
			
			
			//La page de création
			CreatModifTroll composite3;
			composite3 = new CreatModifTroll(getImages(), result);
			pages.add(composite3);
			
			////La page de modification
			CreatModifTroll composite4;
			composite4= new CreatModifTroll(getImages(), result,true);
			pages.add(composite4);
			
			
			pages.setStyleName("page");
			
			RootPanel.get().add(pages);
			
			//On change la page courante
			changerPage(pageCourante);
		}

		public void onFailure(Throwable ex) 
		{
			System.out.println("FAIL\n");
		}
		
	};
	
	// Créer un objet AsyncCallBack pour gérer le résultat.
	AsyncCallback<ArrayList<Result>> CallbackSuppression = new AsyncCallback<ArrayList<Result>>() 
	{
		//Si succes on recharge la page
		public void onSuccess(ArrayList<Result> result) 
		{
			rechargerPage();
		}

		public void onFailure(Throwable ex) 
		{
			System.out.println("FAIL\n");
		}
		
	};
	
	// Créer un objet AsyncCallBack pour gérer le résultat.
	AsyncCallback<ArrayList<Result>> CallbackCreation = new AsyncCallback<ArrayList<Result>>() 
	{
		//Si succes on recharge la page
		public void onSuccess(ArrayList<Result> result) 
		{
			rechargerPage();
		}

		public void onFailure(Throwable ex) 
		{
			System.out.println("FAIL\n");
		}
		
	};
	
	
	// Créer un objet AsyncCallBack pour gérer le résultat.
	AsyncCallback<ArrayList<ResultImage>> CallbackImages = new AsyncCallback<ArrayList<ResultImage>>() 
	{
		//Si succes on stocke la liste d'image
		public void onSuccess(ArrayList<ResultImage> result) 
		{
			listeImages = result;
			
			// Effectuer l'appel au service
			myService.getSauvegarde("FILE", myMethodCallback);
		}

		public void onFailure(Throwable ex) 
		{
			System.out.println("FAIL\n");
		}
		
	};
}
